package com.sunday.reactor.dome;

import com.google.common.collect.Lists;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

import java.util.List;
import java.util.PriorityQueue;

/**
 * @author xuqingxin
 * <p>
 * Reactor
 * Reactor是基于响应式流的第四代响应式库规范，用于在JVM上构建非阻塞应用程序。Reactor 工程实现了响应式流的规范，它提供由响应式流组成的函数式 API。正如你将在后面看到的，Reactor 是 Spring 5 响应式编程模型的基础。关于响应式流在这里简要介绍下：
 * <p>
 * 响应式流的规范可以通过四个接口定义来概括：Publisher，Subscriber，Subscription 和 Processor。
 * <p>
 * Publisher：数据生产者
 * Subscriber：数据订阅者
 * Subscription：数据载体
 * Processor：对生产者的数据进行特定处理，并传给Subscriber。
 * <p>
 * 回头看Reactor中，存在两个核心概念:Mono和Flux。
 * <p>
 * Flux 表示零个、一个或多个（可能是无限个）数据项的管道。
 * <p>
 * Mono 特定用于已知的数据返回项不多于一个的响应式类型。
 */
public class ReactorDemo {

    public static void main(String[] args) {
        Flux<ReactorTestDto> request = getRequest();
        Flux<ReactorTestDto> map = request.map(t -> {
            t.setDes("1246");
            return t;
        });
        map.subscribe(System.out::println);

        request.subscribe(System.out::println);


        PriorityQueue<Integer> queue = new PriorityQueue<>();

        int[] nums = {3,6,8,1,7,9};

        long l = System.currentTimeMillis();
        int kthLargest = ReactorDemo.findKthLargest(nums, 2);
        System.out.println(kthLargest);
        System.out.println(System.currentTimeMillis()-l);
    }

    public static int findKthLargest(int[] nums, int k) {
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for(int num : nums){
            max = Math.max(max, num);
            min = Math.min(min, num);
        }
        int[] bucket = new int[max-min+1];
        for(int i=0; i<nums.length; i++){
            bucket[nums[i] - min]++;
        }
        int count = 0;
        for(int j=bucket.length-1; j>=0; j--){
            count += bucket[j];
            if(count >= k) return j+min;
        }

        return -1;
    }
    public static void testReactor(ReactorRequestDto dto) {

    }


    public static Flux<ReactorTestDto> getRequest() {

        List<ReactorTestDto> list = Lists.newArrayList();
        list.add(new ReactorTestDto("test1", 21, "test1"));
        list.add(new ReactorTestDto("test2", 22, "test2"));
        list.add(new ReactorTestDto("test3", 23, "test3"));
        list.add(new ReactorTestDto("test4", 24, "test4"));
        Flux<ReactorTestDto> flux = Flux.fromIterable(list);

        return Mono.just(list).flatMapMany(Flux::fromIterable);
    }


}

































